package ejb.cbm.operatoria.session;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import ejb.cbm.operatoria.entity.ClienteEntity;
import ejb.cbm.operatoria.local.ClienteSessionLocal;

////@Stateless
public class ClienteSession extends HibernateDaoSupport implements ClienteSessionLocal {
	
	static Logger logger = Logger.getLogger(ClienteSession.class.getName());
	//property constants
	public static final String NUMEROCLIENTE = "numerocliente";
	public static final String CODIGOIDENTIFICACION = "codigoidentificacion";
	public static final String NUMEROIDENTIFICACION = "numeroidentificacion";
	public static final String DIGITOIDENTIFICACION = "digitoidentificacion";
	public static final String INDICADORESTADO = "indicadorestado";
	public static final String FECHANACIMIENTO = "fechanacimiento";
	public static final String INDICADORCLIENTE = "indicadorcliente";
	public static final String INDICADORGRUPO = "indicadorgrupo";
	public static final String CODIGOTITULO = "codigotitulo";
	public static final String PRIMERAPELLIDO = "primerapellido";
	public static final String SEGUNDOAPELLIDO = "segundoapellido";
	public static final String NOMBRECLIENTE = "nombrecliente";
	public static final String NOMBRETARJETA = "nombretarjeta";
	public static final String DESCRIPCIONDIRECCION1 = "descripciondireccion1";
	public static final String DESCRIPCIONCALLE1 = "descripcioncalle1";
	public static final String DESCRIPCIONCALLE2 = "descripcioncalle2";
	public static final String DESCRIPCIONDIRECCION2 = "descripciondireccion2";
	public static final String DESCRIPCIONDIRECCION3 = "descripciondireccion3";
	public static final String NUMERODIRECCION = "numerodireccion";
	public static final String CODIGOPOSTAL = "codigopostal";
	public static final String CODIGOESTADO = "codigoestado";
	public static final String TIPOTELEFONO1 = "tipotelefono1";
	public static final String CODIGOPREFIJO1 = "codigoprefijo1";
	public static final String NUMEROTELEFONO1 = "numerotelefono1";
	public static final String NUMEROEXTTELEFONO1 = "numeroexttelefono1";
	public static final String TIPOTELEFONO2 = "tipotelefono2";
	public static final String CODIGOPREFIJO2 = "codigoprefijo2";
	public static final String NUMEROTELEFONO2 = "numerotelefono2";
	public static final String NUMEROEXTTELEFONO2 = "numeroexttelefono2";
	public static final String TIPOTELEFONO3 = "tipotelefono3";
	public static final String CODIGOPREFIJO3 = "codigoprefijo3";
	public static final String NUMEROTELEFONO3 = "numerotelefono3";
	public static final String NUMEROEXTTELEFONO3 = "numeroexttelefono3";
	public static final String CODIGOESTADOCIVIL = "codigoestadocivil";
	public static final String CODIGOSEXO = "codigosexo";
	public static final String CODIGOGRUPOCLIENTE = "codigogrupocliente";
	public static final String CODIGODIRECCION1 = "codigodireccion1";
	public static final String CODIGODIRECCION2 = "codigodireccion2";
	public static final String CODIGOPROVINCIA = "codigoprovincia";
	public static final String CODIGODISTRITO = "codigodistrito";
	public static final String CODIGOSEGMENTACION = "codigosegmentacion";
	public static final String DESCRIPCIONSEGMENTACION = "descripcionsegmentacion";
	public static final String DESCRIPCIONETIQUETACOMERCIAL = "descripcionetiquetacomercial";
	public static final String USUARIOREGISTRO = "usuarioregistro";
	public static final String USUARIOMODIFICACION = "usuariomodificacion";


    //@PersistenceContext 
	//private EntityManager entityManager;
	
	@Autowired
	public ClienteSession(SessionFactory sessionFactory){
		super.setSessionFactory(sessionFactory);
	}
	
    public void save(ClienteEntity transientInstance) {
    	logger.log("saving ClienteEntity instance", Level.INFO, null,null);
        try {
            getSession().persist(transientInstance);
            logger.log("save successful", Level.INFO, null,null);
        } catch (RuntimeException re) {
        	logger.log("save failed", Level.FATAL,null, re);
            throw re;
        }
    }
    
    public void delete(ClienteEntity persistentInstance) {
    	logger.log("deleting ClienteEntity instance", Level.INFO, null,null);
        try {
            getSession().delete(persistentInstance);
            logger.log("delete successful", Level.INFO, null,null);
        } catch (RuntimeException re) {
        	logger.log("delete failed", Level.FATAL,null, re);
            throw re;
        }
    }
    
    public ClienteEntity update(ClienteEntity detachedInstance) {
    	logger.log("updating ClienteEntity instance", Level.INFO, null,null);
        try {
            ClienteEntity result = (ClienteEntity) getSession().merge(detachedInstance);
            logger.log("update successful", Level.INFO, null,null);
            return result;
        } catch (RuntimeException re) {
        	logger.log("update failed", Level.FATAL,null, re);
            throw re;
        }
    }
    
    public ClienteEntity findById( Long id) {
    	logger.log("finding ClienteEntity instance with id: " + id, Level.INFO, null,null);
        try {
            ClienteEntity instance = (ClienteEntity) getSession().get(ClienteEntity.class, id);
            return instance;
        } catch (RuntimeException re) {
        	logger.log("find failed", Level.FATAL,null, re);
            throw re;
        }
    }
    
    //@SuppressWarnings("unchecked")
    public List<ClienteEntity> findByProperty(String propertyName, Object value) {
    	logger.log("finding ClienteEntity instance with property: " + propertyName
    						+ ", value: " + value, Level.INFO, null,null);
		try {
			String queryString = "select model from ClienteEntity model where model." 
			 						+ propertyName + "= :propertyValue";
			return getSession().createQuery(queryString)
 				.setParameter("propertyValue", value).list();
		} catch (RuntimeException re) {
			logger.log("find by property name failed", Level.FATAL,null, re);
			throw re;
		}
	}
	
	public List<ClienteEntity> findByNumerocliente(Object numerocliente) {
		return findByProperty(NUMEROCLIENTE, numerocliente);
	}
	
	public List<ClienteEntity> findByCodigoidentificacion(Object codigoidentificacion) {
		return findByProperty(CODIGOIDENTIFICACION, codigoidentificacion);
	}
	
	public List<ClienteEntity> findByNumeroidentificacion(Object numeroidentificacion) {
		return findByProperty(NUMEROIDENTIFICACION, numeroidentificacion);
	}
	
	public List<ClienteEntity> findByDigitoidentificacion(Object digitoidentificacion) {
		return findByProperty(DIGITOIDENTIFICACION, digitoidentificacion);
	}
	
	public List<ClienteEntity> findByIndicadorestado(Object indicadorestado) {
		return findByProperty(INDICADORESTADO, indicadorestado);
	}
	
	public List<ClienteEntity> findByFechanacimiento(Object fechanacimiento) {
		return findByProperty(FECHANACIMIENTO, fechanacimiento);
	}
	
	public List<ClienteEntity> findByIndicadorcliente(Object indicadorcliente) {
		return findByProperty(INDICADORCLIENTE, indicadorcliente);
	}
	
	public List<ClienteEntity> findByIndicadorgrupo(Object indicadorgrupo) {
		return findByProperty(INDICADORGRUPO, indicadorgrupo);
	}
	
	public List<ClienteEntity> findByCodigotitulo(Object codigotitulo) {
		return findByProperty(CODIGOTITULO, codigotitulo);
	}
	
	public List<ClienteEntity> findByPrimerapellido(Object primerapellido) {
		return findByProperty(PRIMERAPELLIDO, primerapellido);
	}
	
	public List<ClienteEntity> findBySegundoapellido(Object segundoapellido) {
		return findByProperty(SEGUNDOAPELLIDO, segundoapellido);
	}
	
	public List<ClienteEntity> findByNombrecliente(Object nombrecliente) {
		return findByProperty(NOMBRECLIENTE, nombrecliente);
	}
	
	public List<ClienteEntity> findByNombretarjeta(Object nombretarjeta) {
		return findByProperty(NOMBRETARJETA, nombretarjeta);
	}
	
	public List<ClienteEntity> findByDescripciondireccion1(Object descripciondireccion1) {
		return findByProperty(DESCRIPCIONDIRECCION1, descripciondireccion1);
	}
	
	public List<ClienteEntity> findByDescripcioncalle1(Object descripcioncalle1) {
		return findByProperty(DESCRIPCIONCALLE1, descripcioncalle1);
	}
	
	public List<ClienteEntity> findByDescripcioncalle2(Object descripcioncalle2) {
		return findByProperty(DESCRIPCIONCALLE2, descripcioncalle2);
	}
	
	public List<ClienteEntity> findByDescripciondireccion2(Object descripciondireccion2) {
		return findByProperty(DESCRIPCIONDIRECCION2, descripciondireccion2);
	}
	
	public List<ClienteEntity> findByDescripciondireccion3(Object descripciondireccion3) {
		return findByProperty(DESCRIPCIONDIRECCION3, descripciondireccion3);
	}
	
	public List<ClienteEntity> findByNumerodireccion(Object numerodireccion) {
		return findByProperty(NUMERODIRECCION, numerodireccion);
	}
	
	public List<ClienteEntity> findByCodigopostal(Object codigopostal) {
		return findByProperty(CODIGOPOSTAL, codigopostal);
	}
	
	public List<ClienteEntity> findByCodigoestado(Object codigoestado) {
		return findByProperty(CODIGOESTADO, codigoestado);
	}
	
	public List<ClienteEntity> findByTipotelefono1(Object tipotelefono1) {
		return findByProperty(TIPOTELEFONO1, tipotelefono1);
	}
	
	public List<ClienteEntity> findByCodigoprefijo1(Object codigoprefijo1) {
		return findByProperty(CODIGOPREFIJO1, codigoprefijo1);
	}
	
	public List<ClienteEntity> findByNumerotelefono1(Object numerotelefono1) {
		return findByProperty(NUMEROTELEFONO1, numerotelefono1);
	}
	
	public List<ClienteEntity> findByNumeroexttelefono1(Object numeroexttelefono1) {
		return findByProperty(NUMEROEXTTELEFONO1, numeroexttelefono1);
	}
	
	public List<ClienteEntity> findByTipotelefono2(Object tipotelefono2) {
		return findByProperty(TIPOTELEFONO2, tipotelefono2);
	}
	
	public List<ClienteEntity> findByCodigoprefijo2(Object codigoprefijo2) {
		return findByProperty(CODIGOPREFIJO2, codigoprefijo2);
	}
	
	public List<ClienteEntity> findByNumerotelefono2(Object numerotelefono2) {
		return findByProperty(NUMEROTELEFONO2, numerotelefono2);
	}
	
	public List<ClienteEntity> findByNumeroexttelefono2(Object numeroexttelefono2) {
		return findByProperty(NUMEROEXTTELEFONO2, numeroexttelefono2);
	}
	
	public List<ClienteEntity> findByTipotelefono3(Object tipotelefono3) {
		return findByProperty(TIPOTELEFONO3, tipotelefono3);
	}
	
	public List<ClienteEntity> findByCodigoprefijo3(Object codigoprefijo3) {
		return findByProperty(CODIGOPREFIJO3, codigoprefijo3);
	}
	
	public List<ClienteEntity> findByNumerotelefono3(Object numerotelefono3) {
		return findByProperty(NUMEROTELEFONO3, numerotelefono3);
	}
	
	public List<ClienteEntity> findByNumeroexttelefono3(Object numeroexttelefono3) {
		return findByProperty(NUMEROEXTTELEFONO3, numeroexttelefono3);
	}
	
	public List<ClienteEntity> findByCodigoestadocivil(Object codigoestadocivil) {
		return findByProperty(CODIGOESTADOCIVIL, codigoestadocivil);
	}
	
	public List<ClienteEntity> findByCodigosexo(Object codigosexo) {
		return findByProperty(CODIGOSEXO, codigosexo);
	}
	
	public List<ClienteEntity> findByCodigogrupocliente(Object codigogrupocliente) {
		return findByProperty(CODIGOGRUPOCLIENTE, codigogrupocliente);
	}
	
	public List<ClienteEntity> findByCodigodireccion1(Object codigodireccion1) {
		return findByProperty(CODIGODIRECCION1, codigodireccion1);
	}
	
	public List<ClienteEntity> findByCodigodireccion2(Object codigodireccion2) {
		return findByProperty(CODIGODIRECCION2, codigodireccion2);
	}
	
	public List<ClienteEntity> findByCodigoprovincia(Object codigoprovincia) {
		return findByProperty(CODIGOPROVINCIA, codigoprovincia);
	}
	
	public List<ClienteEntity> findByCodigodistrito(Object codigodistrito) {
		return findByProperty(CODIGODISTRITO, codigodistrito);
	}
	
	public List<ClienteEntity> findByCodigosegmentacion(Object codigosegmentacion) {
		return findByProperty(CODIGOSEGMENTACION, codigosegmentacion);
	}
	
	public List<ClienteEntity> findByDescripcionsegmentacion(Object descripcionsegmentacion) {
		return findByProperty(DESCRIPCIONSEGMENTACION, descripcionsegmentacion);
	}
	
	public List<ClienteEntity> findByDescripcionetiquetacomercial(Object descripcionetiquetacomercial) {
		return findByProperty(DESCRIPCIONETIQUETACOMERCIAL, descripcionetiquetacomercial);
	}
	
	public List<ClienteEntity> findByUsuarioregistro(Object usuarioregistro) {
		return findByProperty(USUARIOREGISTRO, usuarioregistro);
	}
	
	public List<ClienteEntity> findByUsuariomodificacion(Object usuariomodificacion) {
		return findByProperty(USUARIOMODIFICACION, usuariomodificacion);
	}
	

	//@SuppressWarnings("unchecked")
	public List<ClienteEntity> findAll() {
		logger.log("finding all ClienteEntity instances", Level.INFO, null,null);
		try {
			String queryString = "select model from ClienteEntity model";
			return getSession().createQuery(queryString).list();
		} catch (RuntimeException re) {
			logger.log("find all failed", Level.FATAL,null, re);
			throw re;
		}
	}
}